package Spielfeld.Karten;

import java.util.*;

import Enumeration.EnumKartenstapel;
import X.*;

/**
 * 
 * allgemeiner Kartenstapel
 * 
 * @author 
 *
 *@version $Revision: 0.0$
 *@see IKartenStapel
 */
public abstract class Kartenstapel implements IKartenStapel {

	private Queue<ISonderkarte> kartenstapel;
	private EnumKartenstapel m_name;

	/**
	 * Konstruktor
	 * @param <code>instance</code>
	 * @param <code>name</code> eindeutiger Name zur Identifizierung
	 */
	public Kartenstapel(ISpielInstance instance, EnumKartenstapel name){
		kartenstapel = new LinkedList<ISonderkarte>();
		m_name=name;
		AddCards(instance, kartenstapel);
		mischen();
	}

	/**
	 * @see Spielfeld.Karten.IKartenStapel#Karte_nehmen()
	 */
	public ISonderkarte Karte_nehmen(){
		// wirft Exception falls keine Karte vorhanden
		ISonderkarte s = kartenstapel.poll();
		return s;
	}
	
	protected abstract void AddCards(ISpielInstance instance, Queue<ISonderkarte> queue);
	
	/**
	 * @see Spielfeld.Karten.IKartenStapel#mischen()
	 */
	public void mischen(){
		ISonderkarte[] temp_stapel = new ISonderkarte[kartenstapel.size()];
		int size = kartenstapel.size();	

		for(int k=0;k<size; ++k){
			boolean EintragHinzuGefuegt = false;
			while(!EintragHinzuGefuegt){
				int index=(int)(Math.random()*size);
				if(temp_stapel[index] == null){
					temp_stapel[index] = kartenstapel.poll();
					EintragHinzuGefuegt = true;
				}
			}
		}
		
		for(int k=0;k<size; ++k){
			kartenstapel.add(temp_stapel[k]);
		}
	}
	
	/**
	 * @see Spielfeld.Karten.IKartenStapel#Karte_zuruecklegen(X.ISonderkarte)
	 */
	public void Karte_zuruecklegen(ISonderkarte Karte){
		//evtl. um Abfragen erweitern zb Karte schon vorhanden oder so..
		kartenstapel.add(Karte);
	}
	
	public EnumKartenstapel GetName(){
		return m_name;
	}
	
}
